package com.example.service;

import com.example.domain.dto.unit.CreateUnitConversionRequest;
import com.example.domain.dto.unit.CreateUnitRequest;
import com.example.domain.dto.unit.UnitConversionRuleDTO;
import com.example.domain.dto.unit.UnitDTO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 单位服务接口
 * 
 * @author Means
 * @since 2025-10-27
 */
public interface UnitService {
    
    // ==================== 单位管理 ====================
    
    /**
     * 创建单位
     * 
     * @param request 创建单位请求
     * @return 创建的单位DTO
     */
    UnitDTO createUnit(CreateUnitRequest request);
    
    /**
     * 根据代码获取单位
     * 
     * @param code 单位代码
     * @return 单位DTO
     */
    UnitDTO getUnitByCode(String code);
    
    /**
     * 获取所有单位列表
     * 
     * @return 单位列表
     */
    List<UnitDTO> getAllUnits();
    
    /**
     * 删除单位（仅当没有被引用时）
     * 
     * @param code 单位代码
     */
    void deleteUnit(String code);
    
    /**
     * 检查单位是否存在
     * 
     * @param code 单位代码
     * @return 是否存在
     */
    boolean existsUnit(String code);
    
    // ==================== 单位换算规则管理 ====================
    
    /**
     * 创建单位换算规则
     * 
     * @param request 创建换算规则请求
     * @return 创建的换算规则DTO
     */
    UnitConversionRuleDTO createConversionRule(CreateUnitConversionRequest request);
    
    /**
     * 获取从源单位到目标单位的换算规则
     * 
     * @param fromUnit 源单位代码
     * @param toUnit 目标单位代码
     * @return 换算规则DTO，不存在返回null
     */
    UnitConversionRuleDTO getConversionRule(String fromUnit, String toUnit);
    
    /**
     * 获取指定单位的所有换算规则
     * 
     * @param unitCode 单位代码
     * @return 换算规则列表
     */
    List<UnitConversionRuleDTO> getConversionRulesByUnit(String unitCode);
    
    /**
     * 删除换算规则
     * 
     * @param ruleId 规则ID
     */
    void deleteConversionRule(String ruleId);
    
    /**
     * 启用/禁用换算规则
     * 
     * @param ruleId 规则ID
     * @param enabled 是否启用
     */
    void updateConversionRuleStatus(String ruleId, boolean enabled);
    
    // ==================== 单位换算计算 ====================
    
    /**
     * 换算数量（从源单位换算到目标单位）
     * 
     * @param value 数量值
     * @param fromUnit 源单位代码
     * @param toUnit 目标单位代码
     * @return 换算后的数量值
     */
    BigDecimal convertQuantity(BigDecimal value, String fromUnit, String toUnit);
    
    /**
     * 检查两个单位是否可以换算
     * 
     * @param fromUnit 源单位代码
     * @param toUnit 目标单位代码
     * @return 是否可以换算
     */
    boolean canConvert(String fromUnit, String toUnit);
}

